package org.batatasframework.support.database.sql.where;

import java.util.List;

import org.batatasframework.support.database.metadatas.FieldMetadata;
import org.batatasframework.support.database.sql.FieldFragment;
import org.batatasframework.support.database.sql.QueryParameter;
import org.batatasframework.support.database.sql.TableInstance;

import cn.bonoon.kernel.util.Opt;

public abstract class AbstractQueryFragment<T> extends FieldFragment implements QueryFragment{

	/**
	 * 运算符号，如：=、<>等
	 */
	protected final Opt opt;
	protected final T value;
	
	/*
	 * 因为通过FieldMetadata可以知道数据库对应字段的类型，所以在添加查询条件时，不需要显示指定是什么类型，
	 * 而是统计使用Object类型，在具体执行操作的时候，再由数据库的字段来决定如果设置参数和如何生成查询的语句。
	 */
	
	public AbstractQueryFragment(TableInstance tableSource, FieldMetadata fieldMetadata, Opt opt, T value) {
		super(tableSource, fieldMetadata);
		this.opt = opt;
		this.value = value;
	}
	
	protected QueryParameter buildQueryParameter(int index, Object value){
		return fieldMetadata.getDataType().buildQueryParameter(index, opt, value);
	}
	
	/** 添加查询条件的时候需要判断这个参数是否有效 */
	protected boolean addParamenter(List<QueryParameter> paramenters, Object value){

		int index = paramenters.size() + 1;
		QueryParameter queryParameter = buildQueryParameter(index, value);
		if(queryParameter.valid()){
			paramenters.add(queryParameter);
			
			return true;
		}
		return false;
	}

//
//	protected boolean isCharacterData(int typeCode) {
//		return Types.VARCHAR == typeCode
//				|| Types.CHAR == typeCode
//				|| Types.NVARCHAR == typeCode
//				|| Types.NCHAR == typeCode;
//	}

}
